package com.shiro.demo;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.realm.text.IniRealm;
import org.apache.shiro.subject.Subject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 对Demo1的改进，使用DefaultFactory代替过时的IniSecurityManagerFactory
 * @author hjwStart
 * @time 2022-11-21 11:07
 * @version: 1.0
 */
public class Demo2 {

    private static final Logger logger = LoggerFactory.getLogger(Demo1.class);
    public static void main(String[] args) {
        /*
            使用 DefaultSecurityManager 可以通过编码的方式使用自定义的 Realm 对象
            IniSecurityManager 设置自定义的Realm对象，需要在ini配置文件中设置，比较麻烦
        */
        // 1.获取 SecurityManager 对象
        DefaultSecurityManager securityManager = new DefaultSecurityManager();
        // 设置 Realm（数据比对源）
        securityManager.setRealm(new IniRealm("classpath:shiro.ini"));
        // 2.将SecurityManager对象存放到Shiro的全局安全管理对象中
        SecurityUtils.setSecurityManager(securityManager);
        // 3.获取当前程序的主体
        Subject currentUser = SecurityUtils.getSubject();
        // 4.获取主体的认证状态
        boolean authenticated = currentUser.isAuthenticated();
        logger.info("当前用户是否认证：{}",authenticated ? "已认证" : "未认证");
        if (!authenticated){
            logger.info("开始认证");
            // 使用 UsernamePasswordToken 封装Subject的Principals和Credentials信息
            UsernamePasswordToken token = new UsernamePasswordToken("admin", "123123");
            try {
                // 执行认证操作
                currentUser.login(token);
                logger.info("认证成功");
            } catch (Exception e) {
                // 可以在这里自定义异常
                logger.error("认证失败");
            }
        }
    }
}
